/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controladores;

import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import modelo.Causa;
import modelo.DocumentosRelacionadosTramite;
import modelo.Movimiento;
import modelo.PasoProcesal;
import modelo.Persona;
import modelo.Tarea;
import modelo.TiposDeCausa;
import modelo.Tramite;

/**
 *
 * @author nahuel
 */
public class Controlador {

    /** 
     * Este método devuelve una lista de todos las personas que se encuentran 
     * activas en la base de datos
     * @return 
     */
    public ArrayList<Persona> listarPersonas() {
        return Conexiones.getInstance().listarPersonas();
    }
 /** 
     * Este método devuelve una lista de todos los abogados que se encuentran 
     * activas en la base de datos
     * @return 
     */
    public ArrayList<Persona> listarAbogados() {
        return Conexiones.getInstance().listarAbogados();
    }
    /**
     * Este método permite guardar una persona en la base de datos, creando una
     * nueva o si ya existe actualizando sus campos
     */
    public void guardarPersona(Persona persona) {
        Conexiones.getInstance().persist(persona);
    }

    /**
     * Este método permite dejar como inactiva a una persona en la base de datos
     * @param persona 
     */
    public void desactivarPersona(Persona persona) {
        persona.setActivo(false);
        Conexiones.getInstance().persist(persona);
    }

    /**
     * Este método permite guardar un movimiento en la base de datos, creando una
     * nueva o si ya existe actualizando sus campos
     */
    public void guardarMovimiento(Movimiento movimiento) {
        Conexiones.getInstance().persist(movimiento);
    }

    /**
     * Este método permite eliminar un movimiento de la base de datos lógicamente
     * @param movimiento 
     */
    public void eliminarMovimiento(Movimiento movimiento) {
        Conexiones.getInstance().remove(movimiento);
    }
    
     /** 
     * Este método devuelve una lista de todos los tramites que se encuentran 
     * en la base de datos
     * @return 
     */
    public ArrayList<Tramite> listarTramites() {
        return Conexiones.getInstance().listarTramites();
    }
    /**
     * Este método permite guardar un nuevo tramite en la base de datos
     * o si ya existe actualiza sus campos
     */
    public void guardarTramite(Tramite tramite) {
        Conexiones.getInstance().persist(tramite);
    }
     /**
     * Este método permite eliminar un tramite de la base de datos
     * @param movimiento 
     */
    public void eliminarTramite(Tramite tramite) {
        Conexiones.getInstance().remove(tramite);
    }
    
     /**
     * Este método permite eliminar un tramite de la base de datos
     * @param movimiento 
     */
    public void eliminarPasoProcesal(PasoProcesal paso) {
        Conexiones.getInstance().remove(paso);
    }
  
 /** 
     * Este método devuelve una lista de todas las tareas que se encuentran 
     * en la base de datos
     * @return 
     */
    public ArrayList<Tarea> listarTareas() {
        return Conexiones.getInstance().listarTareas();
    }

     /** 
     * Este método devuelve una lista de todas las tareas
     * donde la fecha de realizacion este dentro de los
     * 4 dias de la fecha actual
     * @return 
     */
    public ArrayList<Tarea> listarProximasTareas() {
        return Conexiones.getInstance().listarProximasTareas();
    }
    /**
     * Este método devuelve una lista de todos ls pasos
     * donde la fecha de realizacion este dentro de los
     * 4 dias de la fecha actual
     * @return 
     */
    public ArrayList<PasoProcesal> listarProximosPasos(){
        return Conexiones.getInstance().listarProximosPasos();
    }
    /**
     * Este método permite guardar una nueva tarea en la base de datos
     * o si ya existe actualiza sus campos
     */
    public void guardarTarea(Tarea tarea) {
        Conexiones.getInstance().persist(tarea);
    }
     /**
     * Este método permite eliminar una tarea de la base de datos
     * @param movimiento 
     */
    public void eliminarTarea(Tarea tarea) {
        Conexiones.getInstance().remove(tarea);
    }

    /**
     * Este metodo guarda en la base de datos  un documento relacionado a un 
     * determinado tramite
     * @param documentosRelacionadosTramites 
     */
    public void guardarDocumentosRelacionadosTramite(DocumentosRelacionadosTramite documentosRelacionadosTramites) {
        Conexiones.getInstance().persist(documentosRelacionadosTramites);
    }
   /**
     * Este metodo permite eliminar un documento relacionado a un tramite
     * @param documentosRelacionadosTramites 
     */ 
    public void eliminarElementosRelacionados(DocumentosRelacionadosTramite documentosRelacionadosTramites){
        Conexiones.getInstance().remove(documentosRelacionadosTramites);
    }
 
    
    /**
     * Este método permite obtener una lista de personas que coincidan con los
     * criterios de búsqueda que se le pasan como parámetros
     * @param documento
     * @param nombre
     * @param direccion
     * @param telefono
     * @param email
     * @return 
     */
    public ArrayList<Persona> buscarPersonas(String tipoDocumento, String documento, String nombre, String direccion, String telefono, String email) {
        return Conexiones.getInstance().buscarPersonas(tipoDocumento, documento, nombre, direccion, telefono, email);
    }
    
        /**
     * Este método permite obtener una lista de personas que coincidan con los
     * criterios de búsqueda que se le pasan como parámetros
     * @param documento
     * @param nombre
     * @param direccion
     * @param telefono
     * @param email
     * @return 
     */
    public ArrayList<Persona> buscarAbogados(String tipoDocumento, String documento, String nombre, String direccion, String telefono, String email) {
        return Conexiones.getInstance().buscarAbogados(tipoDocumento, documento, nombre, direccion, telefono, email);
    } 
    /**
     * Este método permite obtener una lista de tramites que comiencen con los
     * criterios de búsqueda que se le pasan como parámetros 
     * @param numero
     * @param descripcion
     * @return 
     */
    public ArrayList<Tramite> buscarTramite(String numero, String descripcion){
    return Conexiones.getInstance().buscarTramite(numero, descripcion);
    }
   
 /**
     * Este método permite obtener una lista de tareas que comiencen con los
     * criterios de búsqueda que se le pasan como parámetros 
     * @param numero
     * @param descripcion
     * @return 
     */
    public ArrayList<Tarea> buscarTarea(String descripcion, String lugar,String hora,String numero, Date fecha){
    return Conexiones.getInstance().buscarTarea(descripcion,lugar,hora,numero,fecha);
    }   
 public List<Causa> listarCausas() {
        return Conexiones.getInstance().listarCausas();
    }

    /** 
     * Este método devuelve una lista de todos los tramites que se encuentran 
     * en la base de datos que tienen como cliente a la persona cuyo id se le
     * pasa como parámetro
     * @return 
     */
    public ArrayList<Tramite> listarTramites(Long id) {
        return Conexiones.getInstance().listarTramites(id);
    }
    
    /** 
     * Este método devuelve una lista de todas las causas que se encuentran 
     * en la base de datos que tienen como cliente a la persona cuyo id se le
     * pasa como parámetro
     * @return 
     */
    public ArrayList<Causa> listarCausas(Long id) {
        return Conexiones.getInstance().listarCausas(id);
    }
    
    /** 
     * Este método devuelve una lista de todos los pasos que se encuentran 
     * en la base de datos que tienen como causa a la causa cuyo id se le
     * pasa como parámetro
     * @return 
     */
    public ArrayList<PasoProcesal> listarPasos(Long id) {
        return Conexiones.getInstance().listarPasos(id);
    }
    

    /** 
     * Este método devuelve una lista de todos los pasos que se encuentran 
     * en la base de datos 
     * pasa como parámetro
     * @return 
     */
    public ArrayList<PasoProcesal> listarPasosProcesales() {
        return Conexiones.getInstance().listarPasosProcesales();
    }
    
    public ArrayList<Movimiento> listarMovimientos() {
        return Conexiones.getInstance().listarMovimientos();
    }
    
    /**
     * Este método permite guardar una nueva causa en la base de datos
     * o si ya existe actualiza sus campos
     */
    public void guardarCausa(Causa causa) {
        Conexiones.getInstance().persist(causa);
    }

    public void guardarPaso(PasoProcesal pasoProcesal) {
        Conexiones.getInstance().persist(pasoProcesal);
    }

    
    public ArrayList<Tramite> listarTramites2(Long id) {
         return Conexiones.getInstance().listarTramites2(id);
    }

    public List<Causa> buscarCausas(String numero, String tipo, String juzgado, String descripcion, String caratula, Date inicio, Date cierre) {
       return Conexiones.getInstance().buscarCausas(numero, tipo, juzgado, descripcion, caratula, inicio, cierre);
    }
    
    public ArrayList<PasoProcesal> buscarPasoAgenda(String descripcion, Date fecha){
        return Conexiones.getInstance().buscarPasoAgenda(descripcion,fecha);
    }

   
    public ArrayList<TiposDeCausa> obtenerTipos() {
        return Conexiones.getInstance().obtenerTipos();
    }

    public void guardarTipoCausa(TiposDeCausa tiposDeCausa) {
        Conexiones.getInstance().persist(tiposDeCausa);
    }

    public List<Movimiento> buscarMovimientosCaja(Date fecha, String debe, String haber, String descripcion) {
        return Conexiones.getInstance().buscarMovimientosCaja(fecha, debe, haber, descripcion);
    }

    public String[] getTotalesMovimientosCaja(Date fecha, String debe, String haber, String descripcion) {
        return Conexiones.getInstance().getTotalesMovimientosCaja(fecha, debe, haber, descripcion);
    }

    public Persona getPersona(String numeroDocumento) {
        return Conexiones.getInstance().getPersona(numeroDocumento);
    }

    public void refresh(Object object) {
        Conexiones.getInstance().refresh(object);
    }

    public void eliminarCausa(Causa causa) {
        Iterator<PasoProcesal> it1 = causa.getPasoProcesals().iterator();
        while (it1.hasNext()) {
            PasoProcesal paso = it1.next();
            Iterator<DocumentosRelacionadosTramite> it2 = paso.getUrlDocumentosRelacionadosPaso().iterator();
            while (it2.hasNext()) {
                DocumentosRelacionadosTramite docRelacionados = it2.next();
                this.eliminarElementosRelacionados(docRelacionados);
            }
            this.eliminarPasoProcesal(paso);
        }
        Conexiones.getInstance().remove(causa);
    }

    public Causa buscarCausa(String numero) {
        return Conexiones.getInstance().buscarCausa(numero);
    }
    
    public boolean testearConexion() {
        try {
            Class.forName("org.gjt.mm.mysql.Driver");
//            Connection conexion = DriverManager.getConnection("jdbc:mysql://192.168.100.102:3306/estudio", "root", "");
            Connection conexion = DriverManager.getConnection("jdbc:mysql://localhost:3306/estudio", "root", "");
            conexion.close();
            return true;
        } catch (Exception ex) {
            return false;
        }
    }   
  
}
